package org.linloong.config.typehandler;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.TypeReference;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.linloong.modules.apis.monitor.entity.DeviceInfo;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

/**
 * 通用列表类型处理器，支持多种类型
 */
@MappedTypes({List.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class GenericListTypeHandler extends AbstractJsonTypeHandler<Object> {

    private final Type type;
    private final Class<?> rawClass;

    public GenericListTypeHandler(Type type) {
        this(type, null);
    }

    public GenericListTypeHandler(Type type, Class<?> rawClass) {
        this.type = type;
        this.rawClass = rawClass;
    }

    @Override
    protected Object parse(String json) {
        if (json == null || json.trim().isEmpty()) {
            return null;
        }

        try {
            // 根据rawClass判断处理方式
            if (rawClass != null) {
                if (rawClass.isAssignableFrom(Float.class)) {
                    return parseFloatList(json);
                } else if (rawClass.isAssignableFrom(DeviceInfo.SensorLayout.class)) {
                    return JSON.parseArray(json, DeviceInfo.SensorLayout.class);
                }
            }

            // 检查是否是参数化类型
            if (type instanceof ParameterizedType) {
                Type rawType = ((ParameterizedType) type).getRawType();
                Type[] actualTypes = ((ParameterizedType) type).getActualTypeArguments();
                
                // 处理List<Float>类型
                if (rawType instanceof Class && ((Class<?>) rawType).isAssignableFrom(List.class) 
                    && actualTypes.length > 0 && actualTypes[0] instanceof Class 
                    && ((Class<?>) actualTypes[0]).isAssignableFrom(Float.class)) {
                    return parseFloatList(json);
                }
                
                // 处理List<DeviceInfo.SensorLayout>类型
                if (rawType instanceof Class && ((Class<?>) rawType).isAssignableFrom(List.class) 
                    && actualTypes.length > 0 && actualTypes[0] instanceof Class 
                    && ((Class<?>) actualTypes[0]).isAssignableFrom(DeviceInfo.SensorLayout.class)) {
                    return JSON.parseArray(json, DeviceInfo.SensorLayout.class);
                }
            }

            // 默认处理方式 - 尝试解析为JSONArray然后根据内容判断
            JSONArray jsonArray = JSON.parseArray(json);
            if (!jsonArray.isEmpty()) {
                Object firstElement = jsonArray.get(0);
                // 如果第一个元素是数字类型，按Float列表处理
                if (firstElement instanceof Number) {
                    return jsonArray.toJavaList(Float.class);
                }
            }
            
            // 否则按JSON对象处理
            return JSON.parseObject(json, type);
        } catch (Exception e) {
            // 出现异常时，尝试按Float列表处理
            try {
                JSONArray jsonArray = JSON.parseArray(json);
                return jsonArray.toJavaList(Float.class);
            } catch (Exception ex) {
                throw new RuntimeException("无法解析JSON: " + json, ex);
            }
        }
    }

    @Override
    protected String toJson(Object obj) {
        return JSON.toJSONString(obj);
    }

    /**
     * 解析Float列表
     */
    private List<Float> parseFloatList(String json) {
        JSONArray jsonArray = JSON.parseArray(json);
        return jsonArray.toJavaList(Float.class);
    }
}